#创建一个简单标签（simple tag）来获取blog中所有已发布的帖子
from django import template
from django.db.models import Count
from django.utils.safestring import mark_safe
import markdown

'''
每一个模板标签（template tags）都需要包含一个register的变量来表明自己是一个有效的标签（tag）库。
register 变量是template.Library的一个实例
'''
register = template.Library()

from ..models import Post

'''
simple_tag：简单标签，处理数据并返回一个字符串（string）
inclusion_tag：包含标签，处理数据并返回一个渲染过的模板（template）
assignment_tag：分配标签，处理数据并在上下文（context）中设置一个变量（variable）
'''

#定义total_posts 标签，并用装饰器定义此函数为一个简单标签并注册
@register.simple_tag #可以指定装饰器的name属性，比如@register.simple_tag(name='my_tag')
def total_posts():
    return Post.published.count()


#指定模板（template）必须被blog/post/latest_posts.html返回的值渲染
#包含标签（inclusion tags）必须返回一个字典值，作为上下文（context）来渲染特定的模板（template）
@register.inclusion_tag('blog/post/latest_posts.html')
def show_latest_posts(count=5):
    latest_posts = Post.published.order_by('-publish')[:count]
    return {'latest_posts': latest_posts}


#构建了一个查询集（QuerySet），聚合了每一个帖子的评论总数并保存在total_comments字段中
@register.assignment_tag
def get_most_commented_posts(count=5):
    return Post.published.annotate(          #查询集使用annotate()进行聚合查询
                total_comments=Count('comments')
            ).order_by('-total_comments')[:count]


@register.filter(name='markdown')
def markdown_format(text):
    return mark_safe(markdown.markdown(text))
